unit UDM;

interface

uses
  SysUtils, Classes, AdvToolBar, AdvToolBarStylers, AdvOfficeStatusBar,
  AdvOfficeStatusBarStylers, AdvOfficePager, AdvOfficePagerStylers, AdvPanel,
  xmldom, XMLIntf, msxmldom, XMLDoc;

type
  TDATOS  = record
    v1      : string;
    v2      : string;
    v3      : string;
    v4      : string;
    NOMBRE  : string;
    CS_X    : Double;
    CS_Y    : Double;
    PT_X    : Double;
    PT_Y    : Double;
    end;

  TSALIDA   = record
    nombre  : string;
    V1      : string;
    v2      : string;
    v3      : string;
    v4      : string;
    Texto   : string;
  end;


  TDM = class(TDataModule)
    AdvOfficeStatusBarOfficeStyler1: TAdvOfficeStatusBarOfficeStyler;
    AdvToolBarOfficeStyler1: TAdvToolBarOfficeStyler;
    AdvOfficePagerOfficeStyler1: TAdvOfficePagerOfficeStyler;
    AdvPanelStyler1: TAdvPanelStyler;

    procedure DataModuleCreate(Sender: TObject);
  private
    { Private declarations }
  public
    nx,ny: integer;
    DATOS : tdatos;
    XMLDOM: TXMLDocument;
    CAMPOS : array of array of String;
    SALIDA : array of TSALIDA;
    Procedure SaveXML(Archivo:String);
    Procedure LoadXML(Archivo:String);
    Procedure Calcula;
    Procedure SalidaTexto;
  end;

var
  DM: TDM;

implementation

{$R *.dfm}

procedure TDM.Calcula;
var
num, x,y: integer;
begin
ny:=Round(datos.CS_X/datos.PT_X)+1;
nx:=Round(datos.CS_y/datos.PT_y)+1;
//
SetLength(CAMPOS,nx,ny);
//
CAMPOS[0,0]:=   DATOS.v1;
CAMPOS[0,ny-1]:=  DATOS.v2;
CAMPOS[nx-1,ny-1]:= DATOS.v3;
CAMPOS[nx-1,0]:=  DATOS.v4;
//
num:=0;
  for x := 0 to nx - 1 do
    begin
    for y := 0 to ny - 1 do
      begin
      if CAMPOS[x,y]='' then
        begin
        Inc(num);
        CAMPOS[x,y]:=IntToStr(num);
        end;
      end;
    end;
SalidaTexto;
end;


procedure TDM.DataModuleCreate(Sender: TObject);
begin
with DATOS do
  begin
  v1:='V1';
  v2:='V2';
  v3:='V3';
  v4:='V4';
  NOMBRE:='Pertenencia';
  CS_X:=1000;
  CS_Y:=1000;
  PT_X:=500;
  PT_Y:=200;
  end;
end;


procedure TDM.LoadXML(Archivo: String);
var
DIVPROY     : IXMLNode;
begin
XMLDOM:=TXMLDocument.Create(self);
XMLDOM.Options := [doNodeAutoIndent];
XMLDOM.Active  := true;
XMLDOM.LoadFromFile(Archivo);
//
DIVPROY:=     XMLDOM.DocumentElement.ChildNodes.FindNode('PROYECTO');

if Assigned(DIVPROY) then
  BEGIN
  //
  datos.v1:=      DIVPROY.ChildNodes.FindNode('V1').Text;
  datos.v2:=      DIVPROY.ChildNodes.FindNode('V2').Text;
  datos.v3:=      DIVPROY.ChildNodes.FindNode('V3').Text;
  datos.v4:=      DIVPROY.ChildNodes.FindNode('V4').Text;
  datos.nombre:=  DIVPROY.ChildNodes.FindNode('NOMBRE').Text;
  datos.CS_X:=    DIVPROY.ChildNodes.FindNode('CONCESION').Attributes['ANCHO'];
  datos.CS_Y:=    DIVPROY.ChildNodes.FindNode('CONCESION').Attributes['ALTO'];
  datos.PT_X:=    DIVPROY.ChildNodes.FindNode('PERTENENCIA').Attributes['ANCHO'];
  datos.PT_Y:=    DIVPROY.ChildNodes.FindNode('PERTENENCIA').Attributes['ALTO'];
  END;


end;




procedure TDM.SalidaTexto;
var
x,y, num: integer;
total: integer;
begin
total:=(nx-1)*(ny-1);
SetLength(SALIDA,total);
//
num:=0;
for x := 0 to nx - 2 do
  begin
  for y := 0 to ny - 2 do
    begin
    SALIDA[num].nombre:=DATOS.NOMBRE+' '+IntToStr(num+1);
    //
    SALIDA[num].V1    :=campos[x,y];
    SALIDA[num].v2    :=campos[x,y+1];
    SALIDA[num].v3    :=campos[x+1,y+1];
    SALIDA[num].v4    :=campos[x+1,y];
    //
    SALIDA[num].Texto :=SALIDA[num].nombre+' : '+
                        SALIDA[num].V1+','+SALIDA[num].v2+','+
                        SALIDA[num].V3+','+SALIDA[num].v4+';';
    Inc(num);
    end;
  end;

end;

procedure TDM.SaveXML(Archivo: String);
var
DIVPROY : IXMLNode;
begin
XMLDOM:=TXMLDocument.Create(self);
XMLDOM.Options:=[doNodeAutoCreate,doNodeAutoIndent,doAttrNull];
XMLDOM.Active  := true;
//
// GUARDAMOS LOS DATOS DEL PROYECTO
//
XMLDOM.AddChild('PROYECTO');

DIVPROY:=XMLDOM.DocumentElement.ChildNodes.FindNode('PROYECTO');
if not Assigned(DIVPROY) then
   BEGIN
   DIVPROY := XMLDOM.DocumentElement.AddChild('PROYECTO');
   //
   DIVPROY.AddChild('V1').Text        :=    datos.v1;
   DIVPROY.AddChild('V2').Text        :=    datos.v2;
   DIVPROY.AddChild('V3').Text        :=    datos.v3;
   DIVPROY.AddChild('V4').Text        :=    datos.v4;
   DIVPROY.AddChild('NOMBRE').Text    :=    datos.nombre;
   with DIVPROY.AddChild('CONCESION') do
    begin
    Attributes['ANCHO']:= datos.CS_X;
    Attributes['ALTO']:= datos.CS_Y;
    end;

   with DIVPROY.AddChild('PERTENENCIA') do
    begin
    Attributes['ANCHO']:= datos.PT_X;
    Attributes['ALTO']:= datos.PT_Y;
    end;
   END;
//
XMLDOM.SaveToFile(Archivo);
end;





end.
